{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Feature extraction without DATA AUGMENTATION\n",
    "  pretrained models mention in book Deep learning with Python by (François Chollet) (page no:145)\n",
    "  \n",
    "     Xception\n",
    "     Inception V3\n",
    "     ResNet50\n",
    "     VGG16\n",
    "     VGG19\n",
    "     MobileNet"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Description of VGG16 model\n",
    "VGG16 (also called OxfordNet) is a convolutional neural network architecture named after the Visual Geometry Group from Oxford, who developed it.\n",
    "It was used to win the ILSVR (ImageNet) competition in 2014.\n",
    "To this day is it still considered to be an excellent vision model, although it has been somewhat outperformed by more revent advances such as Inception and ResNet.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cats_and_dogs_small\\train\n",
      "cats_and_dogs_small\\validation\n",
      "cats_and_dogs_small\\test\n"
     ]
    }
   ],
   "source": [
    "# location of files\n",
    "# using files that we copied in the start\n",
    "\n",
    "original_dataset_dir = \"train\"\n",
    "base_dir = 'cats_and_dogs_small'\n",
    "train_dir = os.path.join(base_dir, 'train')\n",
    "validation_dir = os.path.join(base_dir, 'validation')\n",
    "test_dir = os.path.join(base_dir, 'test')\n",
    "print(train_dir)\n",
    "print(validation_dir)\n",
    "print(test_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# loaded the model\n",
    "from tensorflow.keras.applications import VGG16\n",
    "conv_base = VGG16(weights='imagenet',include_top=False,\n",
    "                  input_shape=(150, 150, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"vgg16\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         [(None, 150, 150, 3)]     0         \n",
      "_________________________________________________________________\n",
      "block1_conv1 (Conv2D)        (None, 150, 150, 64)      1792      \n",
      "_________________________________________________________________\n",
      "block1_conv2 (Conv2D)        (None, 150, 150, 64)      36928     \n",
      "_________________________________________________________________\n",
      "block1_pool (MaxPooling2D)   (None, 75, 75, 64)        0         \n",
      "_________________________________________________________________\n",
      "block2_conv1 (Conv2D)        (None, 75, 75, 128)       73856     \n",
      "_________________________________________________________________\n",
      "block2_conv2 (Conv2D)        (None, 75, 75, 128)       147584    \n",
      "_________________________________________________________________\n",
      "block2_pool (MaxPooling2D)   (None, 37, 37, 128)       0         \n",
      "_________________________________________________________________\n",
      "block3_conv1 (Conv2D)        (None, 37, 37, 256)       295168    \n",
      "_________________________________________________________________\n",
      "block3_conv2 (Conv2D)        (None, 37, 37, 256)       590080    \n",
      "_________________________________________________________________\n",
      "block3_conv3 (Conv2D)        (None, 37, 37, 256)       590080    \n",
      "_________________________________________________________________\n",
      "block3_pool (MaxPooling2D)   (None, 18, 18, 256)       0         \n",
      "_________________________________________________________________\n",
      "block4_conv1 (Conv2D)        (None, 18, 18, 512)       1180160   \n",
      "_________________________________________________________________\n",
      "block4_conv2 (Conv2D)        (None, 18, 18, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block4_conv3 (Conv2D)        (None, 18, 18, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block4_pool (MaxPooling2D)   (None, 9, 9, 512)         0         \n",
      "_________________________________________________________________\n",
      "block5_conv1 (Conv2D)        (None, 9, 9, 512)         2359808   \n",
      "_________________________________________________________________\n",
      "block5_conv2 (Conv2D)        (None, 9, 9, 512)         2359808   \n",
      "_________________________________________________________________\n",
      "block5_conv3 (Conv2D)        (None, 9, 9, 512)         2359808   \n",
      "_________________________________________________________________\n",
      "block5_pool (MaxPooling2D)   (None, 4, 4, 512)         0         \n",
      "=================================================================\n",
      "Total params: 14,714,688\n",
      "Trainable params: 14,714,688\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "conv_base.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "datagen = ImageDataGenerator(rescale=1./255)\n",
    "batch_size = 20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_features(directory, sample_count):\n",
    "    features = np.zeros(shape=(sample_count, 4, 4, 512))\n",
    "    labels = np.zeros(shape=(sample_count))\n",
    "    generator = datagen.flow_from_directory(\n",
    "                    directory,\n",
    "                    target_size=(150, 150),\n",
    "                    batch_size=batch_size,\n",
    "                    class_mode='binary')\n",
    "    \n",
    "    i = 0\n",
    "    for inputs_batch, labels_batch in generator:\n",
    "        features_batch = conv_base.predict(inputs_batch)\n",
    "        features[i * batch_size : (i + 1) * batch_size] = features_batch\n",
    "        labels[i * batch_size : (i + 1) * batch_size] = labels_batch\n",
    "        i += 1\n",
    "        if i * batch_size >= sample_count:\n",
    "            break\n",
    "    return features, labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 2000 images belonging to 2 classes.\n",
      "Found 1000 images belonging to 2 classes.\n",
      "Found 1000 images belonging to 2 classes.\n"
     ]
    }
   ],
   "source": [
    "train_features, train_labels = extract_features(train_dir, 2000)\n",
    "validation_features, validation_labels = extract_features(validation_dir, 1000)\n",
    "test_features, test_labels = extract_features(test_dir, 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_features = np.reshape(train_features, (2000, 4*4* 512))\n",
    "validation_features = np.reshape(validation_features, (1000, 4*4* 512))\n",
    "test_features = np.reshape(test_features, (1000, 4*4* 512))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 2000 samples, validate on 1000 samples\n",
      "Epoch 1/30\n",
      "2000/2000 [==============================] - 2s 834us/sample - loss: 0.6233 - acc: 0.6460 - val_loss: 0.4402 - val_acc: 0.8340\n",
      "Epoch 2/30\n",
      "2000/2000 [==============================] - 1s 443us/sample - loss: 0.4180 - acc: 0.8170 - val_loss: 0.3603 - val_acc: 0.8670\n",
      "Epoch 3/30\n",
      "2000/2000 [==============================] - 1s 424us/sample - loss: 0.3593 - acc: 0.8475 - val_loss: 0.3171 - val_acc: 0.8740\n",
      "Epoch 4/30\n",
      "2000/2000 [==============================] - 1s 451us/sample - loss: 0.3110 - acc: 0.8750 - val_loss: 0.3019 - val_acc: 0.8700\n",
      "Epoch 5/30\n",
      "2000/2000 [==============================] - 1s 455us/sample - loss: 0.2840 - acc: 0.8885 - val_loss: 0.2793 - val_acc: 0.8950\n",
      "Epoch 6/30\n",
      "2000/2000 [==============================] - 1s 442us/sample - loss: 0.2578 - acc: 0.8970 - val_loss: 0.2742 - val_acc: 0.8880\n",
      "Epoch 7/30\n",
      "2000/2000 [==============================] - 1s 441us/sample - loss: 0.2442 - acc: 0.9080 - val_loss: 0.2737 - val_acc: 0.8850\n",
      "Epoch 8/30\n",
      "2000/2000 [==============================] - 1s 432us/sample - loss: 0.2238 - acc: 0.9115 - val_loss: 0.2588 - val_acc: 0.8940\n",
      "Epoch 9/30\n",
      "2000/2000 [==============================] - 1s 430us/sample - loss: 0.2074 - acc: 0.9245 - val_loss: 0.2485 - val_acc: 0.9030\n",
      "Epoch 10/30\n",
      "2000/2000 [==============================] - 1s 429us/sample - loss: 0.2084 - acc: 0.9250 - val_loss: 0.2614 - val_acc: 0.8890\n",
      "Epoch 11/30\n",
      "2000/2000 [==============================] - 1s 440us/sample - loss: 0.1946 - acc: 0.9275 - val_loss: 0.2417 - val_acc: 0.9030\n",
      "Epoch 12/30\n",
      "2000/2000 [==============================] - 1s 431us/sample - loss: 0.1794 - acc: 0.9335 - val_loss: 0.2392 - val_acc: 0.9010\n",
      "Epoch 13/30\n",
      "2000/2000 [==============================] - 1s 431us/sample - loss: 0.1702 - acc: 0.9410 - val_loss: 0.2407 - val_acc: 0.9020\n",
      "Epoch 14/30\n",
      "2000/2000 [==============================] - 1s 432us/sample - loss: 0.1647 - acc: 0.9430 - val_loss: 0.2404 - val_acc: 0.9020\n",
      "Epoch 15/30\n",
      "2000/2000 [==============================] - 1s 435us/sample - loss: 0.1535 - acc: 0.9480 - val_loss: 0.2521 - val_acc: 0.8960\n",
      "Epoch 16/30\n",
      "2000/2000 [==============================] - 1s 434us/sample - loss: 0.1523 - acc: 0.9475 - val_loss: 0.2336 - val_acc: 0.9030\n",
      "Epoch 17/30\n",
      "2000/2000 [==============================] - 1s 433us/sample - loss: 0.1528 - acc: 0.9455 - val_loss: 0.2429 - val_acc: 0.8990\n",
      "Epoch 18/30\n",
      "2000/2000 [==============================] - 1s 437us/sample - loss: 0.1382 - acc: 0.9560 - val_loss: 0.2333 - val_acc: 0.9020\n",
      "Epoch 19/30\n",
      "2000/2000 [==============================] - 1s 459us/sample - loss: 0.1368 - acc: 0.9565 - val_loss: 0.2342 - val_acc: 0.9030\n",
      "Epoch 20/30\n",
      "2000/2000 [==============================] - 1s 447us/sample - loss: 0.1257 - acc: 0.9590 - val_loss: 0.2477 - val_acc: 0.8980\n",
      "Epoch 21/30\n",
      "2000/2000 [==============================] - 1s 460us/sample - loss: 0.1207 - acc: 0.9580 - val_loss: 0.2398 - val_acc: 0.9030\n",
      "Epoch 22/30\n",
      "2000/2000 [==============================] - 1s 437us/sample - loss: 0.1216 - acc: 0.9625 - val_loss: 0.2410 - val_acc: 0.9020\n",
      "Epoch 23/30\n",
      "2000/2000 [==============================] - 1s 435us/sample - loss: 0.1107 - acc: 0.9660 - val_loss: 0.2378 - val_acc: 0.9040\n",
      "Epoch 24/30\n",
      "2000/2000 [==============================] - 1s 433us/sample - loss: 0.1088 - acc: 0.9645 - val_loss: 0.2348 - val_acc: 0.8990\n",
      "Epoch 25/30\n",
      "2000/2000 [==============================] - 1s 442us/sample - loss: 0.1017 - acc: 0.9680 - val_loss: 0.2353 - val_acc: 0.9000\n",
      "Epoch 26/30\n",
      "2000/2000 [==============================] - 1s 433us/sample - loss: 0.1038 - acc: 0.9695 - val_loss: 0.2363 - val_acc: 0.9020\n",
      "Epoch 27/30\n",
      "2000/2000 [==============================] - 1s 434us/sample - loss: 0.0955 - acc: 0.9685 - val_loss: 0.2398 - val_acc: 0.9010\n",
      "Epoch 28/30\n",
      "2000/2000 [==============================] - 1s 461us/sample - loss: 0.0912 - acc: 0.9725 - val_loss: 0.2429 - val_acc: 0.9010\n",
      "Epoch 29/30\n",
      "2000/2000 [==============================] - 1s 432us/sample - loss: 0.0910 - acc: 0.9720 - val_loss: 0.2434 - val_acc: 0.9010\n",
      "Epoch 30/30\n",
      "2000/2000 [==============================] - 1s 419us/sample - loss: 0.0868 - acc: 0.9730 - val_loss: 0.2376 - val_acc: 0.9000\n"
     ]
    }
   ],
   "source": [
    "from tensorflow.keras import models\n",
    "from tensorflow.keras import layers\n",
    "from tensorflow.keras import optimizers\n",
    "\n",
    "model = models.Sequential()\n",
    "model.add(layers.Dense(256, activation='relu', input_dim=4 * 4 * 512))\n",
    "model.add(layers.Dropout(0.5))\n",
    "model.add(layers.Dense(1, activation='sigmoid'))\n",
    "\n",
    "model.compile(optimizer=optimizers.RMSprop(lr=2e-5),\n",
    "                loss='binary_crossentropy',\n",
    "                metrics=['acc'])\n",
    "\n",
    "history = model.fit(train_features, train_labels,\n",
    "                    epochs=30,\n",
    "                    batch_size=20,\n",
    "                    validation_data=(validation_features, validation_labels))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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97vvvtu/9a1vubv7nDlzvFWrVj579uz98lmdjz179viYMWNq9ldaWurTpk1zd/ft27f71q1bfdq0aT5ixAjftm3bPuvWh0r0kiru/2PcErV745SU424zl3zmmrahv3poSSX6A1LflaJ///588YtfrJl+4oknKC0tpbS0lEWLFrFw4cL91mnXrh1nnXUWAMcee2xNqTrd+eefv1+a119/nTFjxgAwePBgBg4cmHHdv/71rwwbNozBgwfzyiuvsGDBAjZs2MDHH3/MV7/6VSA84NS+fXteeOEFxo0bR7t27QA49NBDc/8ipEWJW/qO+/+YS913Y5SU427z4oth0iTo0wfMwuekSWF+ulzTrlgBe/aEz0xpGiJxgT6Xn1b50KFDh5rxd999l5/97Ge8+OKLzJs3j5EjR2ZsV96mTZua8aKiInbt2pVx2wcffPB+adzrflHMtm3buO6663j66aeZN28e48aNq8lHpiaQ7q6mkRJbLtUxcf8fcymgxQ3guQTaXC4KuQTlxg7gcSUu0B+Q+q4sNm3aRMeOHenUqRNr1qxhxowZed/HiBEjmDp1KgDz58/P+Ith+/bttGrViu7du7N582aeeuopALp27Ur37t35wx/+AIQH0bZt28YZZ5zBww8/zPbt2wFYv3593vMtTSff7b5zKX3H/X/MpYDWGCXlXLZZiBIX6JvyhJWWlnLMMcdQXFzMlVdeyfDhw/O+j+uvv54PPviAkpIS7r33XoqLi+ncufM+abp168all15KcXEx5513Hscdd1zNssmTJ3PvvfdSUlLCiBEjqKys5Ctf+QojR46krKyMIUOGcN999+U935J/+W5iGDdtLqXvuP+PuRbQGqOk3FxK340iW+V9Uw35aF6ZZFVVVb59+3Z3d1+yZIn37dvXq6qqmjhXe+lcNUzcm3KN0cQwbtrGavDQmM2iWwJquRnb5IE9fVCgr92GDRu8tLTUS0pKfNCgQT5jxoymztI+dK7qL5dWGnGDbWO0+84ln3Lg1BboC6L3StmrS5cuzJo1q6mzIY2gtrrv9GqEuNUnvXuHKph02dp9x0lbnZdbbw376907VLEkqqojYWLV0ZvZSDNbbGZLzeymDMv7mNlfzWyemb1sZr1Slu02sznRMC2fmRdJklzqvhujiWFjtTyRpldnoDezIuAB4CzgGGCsmR2Tluwe4LfuXgJM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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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Dc7Vtm1bz8/PT9XhRUQy0ty5cze6e8yuvikL6Pn5+cyZMydVhxcRyUhmVukTz6pyERHJEgroIiJZQgFdRCRLaMYikQbiyy+/pKSkhF27dqU6KxKHZs2a0bFjR5o0qWwon4MpoIs0ECUlJbRs2ZL8/HzCIJeSrtydTZs2UVJSQpcuXar/QERGVblMmgT5+dCoUfg7KaFpj0Uatl27dpGXl6dgngHMjLy8vIR/TWVMCX3SJBg5EnbsCOurVoV1gKJajy8n0jAomGeOmlyrjCmh3377/mBeZseOsF1ERDIooK9endh2EUkvmzZtomfPnvTs2ZP27dvToUOH8vU9e+IbNv2aa65h6dKlVaZ55JFHmJSk+tgBAwYwf/78pOyrPmRMlcvRR4dqlljbRST5Jk0Kv4BXrw7/z8aOrV31Zl5eXnlwvPvuu2nRogU//elPD0hTPnt9o9hlzSeeeKLa4/zwhz+seSYzXMaU0MeOhdzcA7fl5obtIpJcZW1Wq1aB+/42q7roiLB8+XIKCgq4/vrr6d27N+vWrWPkyJEUFhbSrVs3xowZU562rMRcWlpK69atGT16ND169ODUU0/l008/BeCOO+7goYceKk8/evRo+vbty4knnsi//vUvALZv384ll1xCjx49GD58OIWFhdWWxCdOnMgpp5xCQUEBt912GwClpaVcddVV5dvHjx8PwG9+8xu6du1Kjx49uPLKK5P+nVUmYwJ6URFMmACdO4NZ+DthghpERepCfbdZLV68mGuvvZZ3332XDh06cN999zFnzhwWLFjAa6+9xuLFiw/6zBdffMHAgQNZsGABp556Kn/6059i7tvdeeedd3jggQfKbw4PP/ww7du3Z8GCBYwePZp33323yvyVlJRwxx13MGPGDN59913eeustXnnlFebOncvGjRt57733eP/997n66qsBuP/++5k/fz4LFizgd7/7XS2/nfhlTECHELyLi2HfvvBXwVykbtR3m9Wxxx7LV7/61fL1Z599lt69e9O7d2+WLFkSM6AfeuihnHvuuQD06dOH4uLimPu++OKLD0oza9Yshg0bBkCPHj3o1q1blfl7++23OeOMM2jbti1NmjThiiuuYObMmRx33HEsXbqUm266ienTp9OqVSsAunXrxpVXXsmkSZMSejCotjIqoItI/aisbaqu2qyaN29e/nrZsmX89re/5Y033mDhwoUMHjw4Zn/spk2blr/OycmhtLQ05r4POeSQg9IkOrFPZenz8vJYuHAhAwYMYPz48Xz/+98HYPr06Vx//fW88847FBYWsnfv3oSOV1NxBfTIHJBLzWy5mY2uJM1lZrbYzBaZ2TOx0ohIZkhlm9WWLVto2bIlhx12GOvWrWP69OlJP8aAAQOYMmUKAO+9917MXwDR+vXrx4wZM9i0aROlpaVMnjyZgQMHsmHDBtydSy+9lHvuuYd58+axd+9eSkpKOOOMM3jggQfYsGEDOyrWX9WRanu5RGZlfwQ4GygBZpvZNHdfHJXmeOC/gP7u/rmZHVFXGRaRuldWnZnMXi7x6t27N127dqWgoIBjjjmG/v37J/0YN954I1dffTXdu3end+/eFBQUlFeXxNKxY0fGjBnDoEGDcHfOP/98zjvvPObNm8e1116Lu2Nm/OpXv6K0tJQrrriCrVu3sm/fPm699VZatmyZ9HOIpdo5Rc3sVOBud/9mZP2/ANz9l1Fp7gc+dPc/xHvgwsJC1wQXIvVnyZIlnHzyyanORlooLS2ltLSUZs2asWzZMs455xyWLVtG48bp1ZM71jUzs7nuXhgrfTy57wCsiVovAb5WIc0JkQO9BeQQbgB/q7gjMxsJjAQ4Wh3IRSRFtm3bxplnnklpaSnuzmOPPZZ2wbwm4jmDWAMKVCzWNwaOBwYBHYE3zazA3Tcf8CH3CcAECCX0hHMrIpIErVu3Zu7cuanORtLF0yhaAnSKWu8IrI2R5mV3/9LdPwKWEgK8iIjUk3gC+mzgeDPrYmZNgWHAtAppXgJOBzCztoQqmJXJzKiIiFSt2oDu7qXAKGA6sASY4u6LzGyMmQ2JJJsObDKzxcAM4D/cfVNdZVpERA4WVyuAu78KvFph211Rrx24ObKIiEgK6ElREakXgwYNOughoYceeogf/OAHVX6uRYsWAKxdu5ahQ4dWuu/qukE/9NBDBzzg861vfYvNmzdX8Yn43H333YwbN67W+0kGBXQRqRfDhw9n8uTJB2ybPHkyw4cPj+vzRx11FFOnTq3x8SsG9FdffZXWrVvXeH/pSAFdROrF0KFDeeWVV9i9ezcAxcXFrF27lgEDBpT3C+/duzennHIKL7/88kGfLy4upqCgAICdO3cybNgwunfvzuWXX87OnTvL091www3lQ+/+7Gc/A2D8+PGsXbuW008/ndNPPx2A/Px8Nm7cCMCDDz5IQUEBBQUF5UPvFhcXc/LJJ/O9732Pbt26cc455xxwnFjmz59Pv3796N69OxdddBGff/55+fG7du1K9+7dywcF+9///d/yCT569erF1q1ba/zdlsn8nvQikrAf/xiSPRFPz54QiYUx5eXl0bdvX/72t79xwQUXMHnyZC6//HLMjGbNmvHiiy9y2GGHsXHjRvr168eQIUMqnVfz0UcfJTc3l4ULF7Jw4UJ69+5d/t7YsWM5/PDD2bt3L2eeeSYLFy7kRz/6EQ8++CAzZsygbdu2B+xr7ty5PPHEE7z99tu4O1/72tcYOHAgbdq0YdmyZTz77LM8/vjjXHbZZTz//PNVjm9+9dVX8/DDDzNw4EDuuusu7rnnHh566CHuu+8+PvroIw455JDyap5x48bxyCOP0L9/f7Zt20azZs0S+LZjUwldROpNdLVLdHWLu3PbbbfRvXt3zjrrLD7++GPWr19f6X5mzpxZHli7d+9O9+7dy9+bMmUKvXv3plevXixatKjagbdmzZrFRRddRPPmzWnRogUXX3wxb775JgBdunShZ8+eQNVD9EIYn33z5s0MHDgQgO985zvMnDmzPI9FRUVMnDix/InU/v37c/PNNzN+/Hg2b96clCdVVUIXaYCqKknXpQsvvJCbb76ZefPmsXPnzvKS9aRJk9iwYQNz586lSZMm5OfnxxwyN1qs0vtHH33EuHHjmD17Nm3atGHEiBHV7qeq8azKht6FMPxudVUulfnLX/7CzJkzmTZtGj//+c9ZtGgRo0eP5rzzzuPVV1+lX79+vP7665x00kk12n8ZldBFpN60aNGCQYMG8d3vfveAxtAvvviCI444giZNmjBjxgxWxZpAOMppp51WPhH0+++/z8KFC4Ew9G7z5s1p1aoV69ev569//Wv5Z1q2bBmznvq0007jpZdeYseOHWzfvp0XX3yRb3zjGwmfW6tWrWjTpk156f7pp59m4MCB7Nu3jzVr1nD66adz//33s3nzZrZt28aKFSs45ZRTuPXWWyksLOSDDz5I+JgVqYQuIvVq+PDhXHzxxQf0eCkqKuL888+nsLCQnj17VltSveGGG7jmmmvo3r07PXv2pG/fvkCYfahXr15069btoKF3R44cybnnnsuRRx7JjBkzyrf37t2bESNGlO/juuuuo1evXlVWr1Tmqaee4vrrr2fHjh0cc8wxPPHEE+zdu5crr7ySL774AnfnJz/5Ca1bt+bOO+9kxowZ5OTk0LVr1/LZl2qj2uFz64qGzxWpXxo+N/MkOnyuqlxERLKEArqISJZQQBdpQFJVxSqJq8m1UkAXaSCaNWvGpk2bFNQzgLuzadOmhB82Ui8XkQaiY8eOlJSUsGHDhlRnReLQrFkzOnbsmNBnFNBFGogmTZrQpUuXVGdD6pCqXEREsoQCuohIllBAFxHJEgroIiJZQgFdRCRLKKCLiGQJBXQRkSyhgC4ikiUU0EVEsoQCuohIllBAFxHJEgroIiJZQgFdRCRLxBXQzWywmS01s+VmNjrG+yPMbIOZzY8s1yU/qyIiUpVqh881sxzgEeBsoASYbWbT3H1xhaTPufuoOsijiIjEIZ4Sel9gubuvdPc9wGTggrrNloiIJCqegN4BWBO1XhLZVtElZrbQzKaaWadYOzKzkWY2x8zmaNYUEZHkiiegW4xtFScl/B8g3927A68DT8XakbtPcPdCdy9s165dYjkVEZEqxRPQS4DoEndHYG10Anff5O67I6uPA32Skz0REYlXPAF9NnC8mXUxs6bAMGBadAIzOzJqdQiwJHlZFBGReFTby8XdS81sFDAdyAH+5O6LzGwMMMfdpwE/MrMhQCnwGTCiDvMsIiIxmHvF6vD6UVhY6HPmzEnJsUVEMpWZzXX3wljv6UlREZEsoYAuIpIlFNBFRLKEArqISJZQQBcRyRIK6CIiWUIBXUQkSyigi4hkCQV0EZEsoYAuIpIlFNBFRLKEArqISJZQQBcRyRIK6CIiWSIjA/qaNdWnERFpaDIuoN97L5xwAmzZkuqciIikl4wL6GedBbt2wQsvpDonIiLpJeMC+te+BsceC5MmpTonIiLpJeMCuhkUFcEbb8DatanOjYhI+si4gA4hoO/bB5MnpzonIiLpIyMD+gknQGGhql1ERKJlZECHUEqfNw+WLIn9/qRJkJ8PjRqFvwr+IpLtMjagDxsWgnWsQD1pEowcCatWgXv4O3KkgrqIZLeMDejt24cujM88E4J2tNtvhx07Dty2Y0fYLiKSrTI2oEOodvnoI/i//ztw++rVsdNXtl1EJBtkdEC/6CI49NCDq1KOPjp2+sq2i4hkg4wO6C1bwpAh8Nxz8OWX+7ePHQu5uQemzc0N20VEslVcAd3MBpvZUjNbbmajq0g31MzczAqTl8WqXXklbNoE06fv31ZUBBMmQOfO4UGkzp3DelFRfeVKRKT+mVdsUayYwCwH+BA4GygBZgPD3X1xhXQtgb8ATYFR7j6nqv0WFhb6nDlVJonLl1/CkUfC2WfDs8/WenciImnNzOa6e8xCczwl9L7Acndf6e57gMnABTHS/Ry4H9hV45zWQJMmcNll8PLLsHVrfR5ZRCS9xBPQOwDRI5CXRLaVM7NeQCd3fyWJeYtbURHs3AkvvpiKo4uIpId4ArrF2FZeT2NmjYDfALdUuyOzkWY2x8zmbNiwIf5cVuPrX9fToCIi8QT0EqBT1HpHIHqcw5ZAAfBPMysG+gHTYjWMuvsEdy9098J27drVPNcVlI3A+Prr8MknSdutiEhGiSegzwaON7MuZtYUGAZMK3vT3b9w97bunu/u+cC/gSHVNYomW9kIjM89V59HFRFJH9UGdHcvBUYB04ElwBR3X2RmY8xsSF1nMF4nnwy9esHEianOiYhIajSOJ5G7vwq8WmHbXZWkHVT7bNVMURH89Kfw4YdhiF0RkYYko58UrWj48FCfrsZREWmIsiqgH3UUnHFGCOjVPC8lIpJ1siqgQ6h2WbEC3n471TkREalfWRfQL74YDjlE1S4i0vBkXUBv1Sr2CIwiItku6wI6hGqXDRvCg0YiIg1FVgb0c8+FNm3UJ11EGpasDOhNm8Kll8JLL8G2bVWnnTQpjAPTqJHGgxGRzJaVAR3CxBc7dlQ9AuOkSTByJKxaFbo5rloV1hXURSQTVTvBRV1J1gQXldm3DwoKQlB/770wXV1F+fkhiFfUuTMUF9dZ1kREaqy2E1xkpEaN4A9/gNWrYXQlk+atXp3YdhGRdJa1AR3COOk33QS//z38858Hv3/00bE/V9l2EZF0ltUBHWDsWDj2WLj2Wti+/eD3cnMP3JabG7aLiGSarA/oubnwxz/CypVw++0HvldUBBMmhDpzs/B3woSwXUQk02Rto2hFo0aFqpc334T+/evtsCIiSdUgG0Uruu++UDf+3e+GCaVFRLJNgwnoLVqEXi8ffgh3xZyaQ0QkszWYgA5w1lnwve/Bgw9qeF0RyT4NKqADPPBAmAjjmmtg165U50ZEJHkaXEBv1QoefxyWLIExY1KdGxGR5GlwAR1g8GAYMQLuvx/mzk11bkREkqNBBnQI9ehHHBGqXvbsSXVuRERqr8EG9DZt4LHHwsBdejJURLJBgw3oAOefH54K/cUvYP78VOdGRKR2GnRAB/jtbyEvD666Ct5/v+q0mgxDRNJZgw/oeXnw5JNhyNzu3UNjaawx0jUZhoikuwYf0CH0elm5Em65BSZPhhNOgB//OEw0Xeb228NkGdF27Dh4wC8RkVRRQI/IywsPHS1bFqpfHn4YjjkG7rkHtm7VZBgikv7iCuhmNtjMlprZcjM7aP4fM7vezN4zs/lmNsvMuiY/q/WjU6cw5suiRXDOOXD33WE89datY6fXZBgiki6qDehmlgM8ApwLdAWGxwjYz7j7Ke7eE7gfeDDpOa1nJ50Ezz8fxnwpKIDPPw9jpkfTZBgikk7iKaH3BZa7+0p33wNMBi6ITuDuW6JWmwOpGWS9DvTtC//4B/z972ECjDIdO2oyDBFJL/EE9A7Amqj1ksi2A5jZD81sBaGE/qNYOzKzkWY2x8zmbIhucUxzZnD22bBiRRgH5pBDQtfFk05Kdc5ERPaLJ6BbjG0HlcDd/RF3Pxa4Fbgj1o7cfYK7F7p7Ybt27RLLaRpo1Aiuuw5mzQpdF/v3h6eeSnWuRESCeAJ6CdApar0jsLaK9JOBC2uTqXRXWBgG9fr610O/9RtvhC+/THWuRKShiyegzwaON7MuZtYUGAZMi05gZsdHrZ4HLEteFtNTu3ahXv2WW+B3v4Mzz4RPPgnv6YlSEUmFxtUlcPdSMxsFTAdygD+5+yIzGwPMcfdpwCgzOwv4Evgc+E5dZjpdNG4M48ZBnz5w7bXh78iRYVjesoeQyp4oBTWgikjdMvfUdEgpLCz0OXPmpOTYdWHBArjoIvjoo9jvd+4MxcX1miURyUJmNtfdC2O9pydFk6RHD6jq/qQnSkWkrimgJ9Hhh1f+5OhXvgLbt9dvfkSkYam2Dl0S84tfhDrzigN5ffIJtGwJxx0XRnWMXsoaUEVEakMBPcnKGj5vvz1Us3TqFEZu7NIFFi7cv7zwQujLDtC8eSjdN2kSGlqbNDnwdfS2I4+En/4UunVL3TmKSHpSo2iKbN8eBgBbuDBMg7dlS+jLXloa+2/Z68WLYdu2MCLk3XeHG4WINBxVNYqqhJ4izZuHcWL69k3sc5s2wa9+FYb3ffZZ+N734I47QsldRBo21dxmmLy80M99xYowDMGECWF431tvhc8+S3XuRCSVFNBTrKZPlR51FPz+9/DBB3DJJWFyji5d4N57w4QcdWHLFti7t272LSK1p4CeQsmYp/TYY+Hpp0Nd/BlnwJ13hm0PPXRwT5ua+te/wk2jdWvo1y/cREQk/Sigp1Ay5yktKIAXXwwTcvToAT/5Sej7PmIEvP564iXrvXvDBB+nnhpGlZwxA66/Psy92qsXjB8P+/Ylnk8RqTsK6ClUF/OU9u0Lr70Gb74Jl18egvzZZ4fuk7fcAu++u7+7ZCzbtoUG1xNOgKFD4dNPw/qaNaGK5/33wy+Bm24KU/StWVP5vkSkfimgp1BlT5UmY57SAQPC3Kjr18N//3cI9A8/DL17h9L8L38ZqnjKrFsHt90Wjv2jH4XS/dSp8OGHMGpU6JUDoTfNK6/AY4/Bv/8Np5wCEydWfZNIR8XF4Xy/+12NsSNZxN1TsvTp08cbuokT3XNz3UM4DEtubtgeK23nzu5m4W+sNNXZuNH90Ufd+/fff7zTTnMvKnJv0iTs++KL3d96K779LV/u/vWvh/0MHRr2n85KS93/8hf3884L59qokfuhh7o3b+4+frz73r2pzmHtbd2aHechlSOMchszriqgp1g8gTqRwB+vlSvd773X/cQTw75++EP3ZcsS309pqfsvfxluCO3bh4CZbtavD3nMzw/fXfv27nfe6b56tfuqVe6DB4ft/fu7f/BBqnNbM4sWuV91lXtOjntenvvw4e5PPum+dm2qcybJVlVA15OiGSA//8DqkTLJGJK37BZR27Fk5s8PT6++/37oqfPrX0OLFrXbZ224w1tvwaOPhqqjPXvg9NPhhhvgwgvDMArRaZ9+OgzRsGMH/OxnYXiF6DTxWrwYSkrgtNOgWbPknU9l3nknVJ+99BLk5sI114TupX//e6hugzBe0De/GZYBA8KcuFK5HTvg449D+9DHH8OuXeEp7bJl794D18uWli1DlWZhYZgAp65U9aSoAnoGaNQodh21WXr1NNm9O3SbHDcOWrUKN5yvfOXA5YgjDlxv1y6cw5YtYfnii/2vKy47d4bvIicnLNGvo5c9e+C558KQCocdFnr6XH89nHxy1flfvz60F0ydGnry/PGP4W9V3EOX0alTQ6+gJUvC9sMOgwsugMsuC43SyQyi7vDGG2EguDfeCN1Jb7wxtH20bRvS7NsX8jV9elhmzQrDR+TmwqBBIbj36ROC1fbtVS87d4axhjp2DI3rnTqF1x061Oyml0q7d4dAvXp1uPGuWXPg35KS8DR2InJywnhLu3fv39a5cwjsX/1q+NunT7hOyaCAnuHqsoReF2bNgj//OYwwuX79/mXXrprvMycHDj00BKp9+0Ipae/eym9ovXrBD34Aw4fvb9CN1wsvhM9u3BiewL3zzgNL2+5hTtmyIL58ebi5DBwYegYdfXTYx4svwubN4eZ20UUhuJ95JjRtWrPvYN8+mDYtBPLZs6F9e7j55nCzatmy6s9u2xa6npYF+OXLq06fkxO+t34E7XcAAAvLSURBVObNw/e+cWO4qUYzCzfl6CBfFug7dAgPv3XoEG4i9WX79vB/JXopLt7/et26gwtHeXn7b1YV/3boEL6Dxo33B+7oJScnfA8Qvp9588K8CGXLihX7j3PccfsD/HnnwYkn1uwcFdAzXNkDSNF91nNzw2P/mTKtnXt4gjU6wK9fH7pFNm0aSrSxllatwt9mzfb/x6m434oB3j38J4yVPl6ffRa6eT75JJx0Ejz+ePjP+/zzIZCvWhXWzzwzPHR14YXh10e0PXvCMwDPPReqRLZsgTZt4OKLQ3A/44wQFGKd0+7d4Qa4a1d4PXMm3HdfqNLp0gX+8z/DL4+aVuusWAHLloV/R2WBO3pp2vTg72/Llv2l2Iol27K/FYM+hJJpdIDv0CH0lmrceH91Rdngc9FL2bY9e8KvhIrLjh0Hr2/efOCxmzQJgblz54OXsoBdlzeczz4LN/+yAD97dviuHn88DN1REwroWWDSpP1D8h59NIwdmznBPJNNnx5upmXPBjRpEvrfX3IJDBkSSnfx2L071GtPmQIvvxxubocfHqpIogN32d9YCgrgv/4r3Axi3QjSwZYtsHZtqHv++OMDX5ctn3xS/YNu0aXgpk3Dr4R4lqOO2h+w8/PDr5icnHo59bitXx9uxK1a1ezzCugNjIJ/cm3dGvrdt28P3/527etCd+2Cv/0tVJ/s2BH+c0cvhxxy8LZOnUKJPhsmQtm7N1Th7Nu3P2iXjftfsRpDDqaA3oBkQ/WMiFROk0Q3IMkcH0ZEMosCepapi/FhRCQzKKBnmbocH0ZE0psCepYZO/bgbli5uWG7iGQ3BfQsU1QUGkA7dw49BTp3rrxBNJHZkmo6s5KI1B/1cmmgEukNo54zIulD3RblIIkMJ5BpQw+IZLNad1s0s8FmttTMlpvZ6Bjv32xmi81soZn9w8w61zbTUrcS6Q2jnjMimaHagG5mOcAjwLlAV2C4mXWtkOxdoNDduwNTgfuTnVFJrkR6w6jnjEhmiKeE3hdY7u4r3X0PMBm4IDqBu89w97Ia1n8DHZObTUm2RHrDJJJWjaciqRNPQO8ARE8FXBLZVplrgb/GesPMRprZHDObs2HDhvhzKUmXSG+YeNOWNZ6uWhVGDFy1KqwrqIvUj2obRc3sUuCb7n5dZP0qoK+73xgj7ZXAKGCgu1cyZlygRtHso8ZTkbpXVaNoPINwlgCdotY7AmtjHOQs4HbiCOaSndR4KpJa8VS5zAaON7MuZtYUGAZMi05gZr2Ax4Ah7v5p8rMpmUCNpyKpVW1Ad/dSQjXKdGAJMMXdF5nZGDMbEkn2ANAC+G8zm29m0yrZnWQxDTsgklpx9UN391fd/QR3P9bdx0a23eXu0yKvz3L3r7h7z8gypOo9SjZKpKEV1CNGJNnSdCIryVRFRfENB1BxOIGyHjFl+xCRxGlwLkkJTcQhknwK6JISifSIUdWMSHwU0CUl4u0Ro4eVROKngC4pEW+PmESrZlSal4ZMAV1SIt4eMYlWzag0Lw2ZxkOXtKZx20UOVOvx0EVSJZGHlTT0gDR0CuiS1hJ5WCmRoQdU1y7ZSAFd0l5RUagy2bcv/K3swaN4S/OJ1rXHG/x1k5CUc/eULH369HGRZJs40b1zZ3ez8HfixIPTdO7sHkL5gUvnzrH3l5t7YLrc3IP3G286kdoC5nglcVWNotLgNGoUQm5FZuFXQLR4G1rVICv1RY2iIlESqWuPt6FVDbKSDhTQpcFJpOdMvMFfY8FLOlBAlwYnkZ4z8Qb/RMeCV0Or1InKKtfrelGjqGSKeBpaE02nhlapKdQoKpI+1NAqtaFGUZE0ooZWqSsK6CL1TA2tUlcU0EXqWaobWiV7KaCL1LN4e9kk0hsnkeEMEgn8uklkFjWKimSBeBtQK07ODaHUH+tGkUhaqT9VNYoqoItkgXiHM9D48plPvVxEsly8DaiJ9JxRL5vMo4AukgXibUBNpOeMxpfPPAroIlkg3gbURHrOpHp8eamByh4hretFj/6LpEa8QxTEm7YuxpeXylHFo/8qoYs0MPHOABVv2kTq2m+//cBeMxDWb7/94LTqXpm4uAK6mQ02s6VmttzMRsd4/zQzm2dmpWY2NPnZFJF0VRfjyyfarz6RKp9sVm1AN7Mc4BHgXKArMNzMulZIthoYATyT7AyKSHqri/HlEynJJ5I228VTQu8LLHf3le6+B5gMXBCdwN2L3X0hsC/WDkQke9XF+PJ11b0y26tm4gnoHYA1UeslkW0JM7ORZjbHzOZs2LChJrsQkTQUb718vMG/LrpX1lVvnLS6SVTWWlq2AJcCf4havwp4uJK0TwJDq9unq5eLiFQhkd4w8aati944qei1Qy17uZQAnaLWOwJrk3hPERE5QCLVOPGmrYveOInW39d1ab7asVzMrDHwIXAm8DEwG7jC3RfFSPsk8Iq7T63uwBrLRUTqUyJj08Q7Nk686SB5g53VaiwXdy8FRgHTgSXAFHdfZGZjzGxI5ABfNbMSQvXMY2Z2ULAXEUmluuiNk0hdf330xomrH7q7v+ruJ7j7se4+NrLtLnefFnk92907untzd89z927Jy6KISO3VRW+cRG4S9THYmZ4UFZEGI9m9cRK5SdTHlIIaD11EpB6kRR26iIjUXiKl+ZpqnLxdiYhIVYqK6nb6PpXQRUSyhAK6iEiWUEAXEckSCugiIllCAV1EJEukrB+6mW0AKo6s0BbYmILs1JVsOx/IvnPKtvOB7DunbDsfqN05dXb3drHeSFlAj8XM5lTWYT4TZdv5QPadU7adD2TfOWXb+UDdnZOqXEREsoQCuohIlki3gD4h1RlIsmw7H8i+c8q284HsO6dsOx+oo3NKqzp0ERGpuXQroYuISA0poIuIZIm0COhmNtjMlprZcjMbner8JIOZFZvZe2Y238wycuB3M/uTmX1qZu9HbTvczF4zs2WRv21SmcdEVHI+d5vZx5HrNN/MvpXKPCbCzDqZ2QwzW2Jmi8zspsj2TL5GlZ1TRl4nM2tmZu+Y2YLI+dwT2d7FzN6OXKPnzKxpUo6X6jp0M8shTEJ9NlBCmIR6uLsvTmnGasnMioFCd8/YByLM7DRgG/Bndy+IbLsf+Mzd74vcfNu4+62pzGe8Kjmfu4Ft7j4ulXmrCTM7EjjS3eeZWUtgLnAhMILMvUaVndNlZOB1MjMDmrv7NjNrAswCbgJuBl5w98lm9v+ABe7+aG2Plw4l9L7Acndf6e57gMnABSnOkwDuPhP4rMLmC4CnIq+fIvxnywiVnE/Gcvd17j4v8norYRL3DmT2NarsnDKSB9siq00iiwNnAFMj25N2jdIhoHcA1kStl5DBFzCKA383s7lmNjLVmUmir7j7Ogj/+YAjUpyfZBhlZgsjVTIZUz0RzczygV7A22TJNapwTpCh18nMcsxsPvAp8BqwAtjs7qWRJEmLeekQ0C3GtmzoS9nf3XsD5wI/jPzcl/TzKHAs0BNYB/w6tdlJnJm1AJ4HfuzuW1Kdn2SIcU4Ze53cfa+79wQ6EmokTo6VLBnHSoeAXgJ0ilrvCKxNUV6Sxt3XRv5+CrxIuJDZYH2knrOsvvPTFOenVtx9feQ/3D7gcTLsOkXqZZ8HJrn7C5HNGX2NYp1Tpl8nAHffDPwT6Ae0NrOyKUCTFvPSIaDPBo6PtPo2BYYB01Kcp1oxs+aRBh3MrDlwDvB+1Z/KGNOA70Refwd4OYV5qbWywBdxERl0nSINbn8Elrj7g1FvZew1quycMvU6mVk7M2sdeX0ocBahXWAGMDSSLGnXKOW9XAAiXZAeAnKAP7n72BRnqVbM7BhCqRzCRNzPZOI5mdmzwCDCUJ/rgZ8BLwFTgKOB1cCl7p4RDY2VnM8gws94B4qB75fVP6c7MxsAvAm8B+yLbL6NUOecqdeosnMaTgZeJzPrTmj0zCEUoKe4+5hIjJgMHA68C1zp7rtrfbx0COgiIlJ76VDlIiIiSaCALiKSJRTQRUSyhAK6iEiWUEAXEckSCugiIllCAV1EJEv8f2aS3FyBHtcBAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "acc = history.history['acc']\n",
    "val_acc = history.history['val_acc']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "epochs = range(1, len(acc) + 1)\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "plt.figure()\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "gputest",
   "language": "python",
   "name": "gputest"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
